# -*- coding: utf-8 -*-

"""
并发编程
实现多任务爬虫的目的: 提高效率
并发与并行
并发与并行，他是用来描述在计算机系统中同时处理多个任务的两个不同场景
1.多任务: 在同一时间段内执行多个任务，电脑当中可以同时运行多个任务
2.并发: 系统可以处理多个任务的能力，但并不代表这些任务是同一时刻执行的， 单核与多核，利用时间分片快速的在不同任务之间切换，适用场景: 大量等待， I/O读写
3.并行: 真正多个任务同时执行，这通常要求多个处理器，每一个处理器核心可以同时执行一个不同的任务

总结: 并发与并行关键: 并发是关于如果在单核或者多核cpu上有效的处理多任务，并行同时执行多个任务

python对并发编程
1.多线程: threading,利用cpu和IO(输入input/输出onput),可以同时执行的原理，cpu不会干巴巴的等待IO完成
2.多进程: 利用多核cpu，真正的执行并行任务
3.多协程： 在单线程当中利用cpu和io同时执行的原理
4.多进程里面包含了多个线程，线程包含多个协程

cpu密集型计算， IO密集型计算
cpu密集型计算:
    核心资源: cpu
    特点: 大量的数学计算，科学计算，图像处理，大数据处理
IO密集型计算:
    核心资源: 输入/输出设备，硬盘，网络等等
    适用场景: 等待数据的读取写入，文件处理，数据库处理，网络通信，cpu经常处理等待的状态，因为他需要将数据从硬盘或者网络传输过来

判断一个很大的数是否是素数

总结:
cpu密集型计算: 依赖cpu计算能力，采用多进程来提高效率
I/O密集型计算: 依赖于数据的读写速度，适合用多协程(aiohttp)或者多线程来减少等待时间
多协程他是不支持requests库

在python当中他是没有真正意义上的多线程
全局解释器锁(GIL)，即使多核处理器，适用了GIL，同一个时间，只能执行一个线程

并发:任务数量大于cpu核数
并行:任务数量小于cpu核数
"""


